﻿//using System;
//using System.Collections.Generic;
//using System.ComponentModel;
//using System.Linq;
//using System.Text;
//using System.Web.Mvc;
//using ProjectBase.Core;
//using $prjsn$.Entity.Services;
//using $prjsn$.Entity;
//using ProjectBase.Mvc.Controllers;

//namespace $safeprojectname$.Core.Mvc
//{
//    public class ImprovedBinder : SmartBinder
//    {
//        protected virtual object TryBindNullableList(ControllerContext controllerContext, ModelBindingContext bindingContext
//                                                   , PropertyDescriptor propertyDescriptor, IModelBinder propertyBinder)
//        {
//            var result = base.GetPropertyValue(controllerContext, bindingContext, propertyDescriptor, propertyBinder);

//            var type = propertyDescriptor.PropertyType;
//            var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);

//            var couldBindList = type.HasTypeListOf<ValueType>()
//                                && value.Is()
//                                && value.RawValue is IEnumerable<string>;

//            if (!couldBindList)
//            {
//                return result;
//            }
//            object list;
//            var isBounded = TryBindNullableList<int>(result, value, out list)
//                            || TryBindNullableList<decimal>(result, value, out list)
//                            || TryBindNullableList<bool>(result, value, out list)
//                            || TryBindNullableList<DateTime>(result, value, out list)
//                            || TryBindNullableList<long>(result, value, out list)
//                            || TryBindNullableList<Guid>(result, value, out list)
//                            || TryBindNullableList<byte>(result, value, out list)
//                            || TryBindNullableList<uint>(result, value, out list)
//                            || TryBindNullableList<ulong>(result, value, out list)
//                            || TryBindNullableList<ushort>(result, value, out list)
//                            || TryBindNullableList<sbyte>(result, value, out list)
//                ;
//            if (isBounded)
//            {
//                return list;
//            }
//            return result;

//        }

//        protected virtual bool TryBindNullableList<TValue>(object result, ValueProviderResult valueResult, out object list )
//            where TValue : struct
//        {
//            list = null;
//            var emptyResult = result as IList<TValue?>;
//            if (emptyResult.IsNull())
//            {
//                return false;
//            }

//            if (emptyResult.IsNotEmpty())
//            {
//                list = emptyResult;
//                return true;
//            }


//            var newList = new List<TValue?>();

//            foreach (var stringValue in valueResult.RawValue as IEnumerable<string>)
//            {
//                TValue value;
//                if (stringValue.IsEqual("null"))
//                {
//                    newList.Add(null);
//                    continue;
//                }
//                if (stringValue.TryParse(out value, valueResult.Culture))
//                {
//                    newList.Add(value);
//                }
//            }

//            list = newList;
//            return true;
//        }
//    }
//}
